package god;

import god.model.SungJuk2VO;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

public class J21SungJuk {
	
	// 숫자를 특정 형식에 맞춰 출력하는 도우미 클래스
	// NumberFormat
	// DecimalFormat
	// Format 메서드에 특정 패턴 (0,#)을 이용해서 다양한 형식으로 숫자를 출력할 수 있다.

	public static void main(String[] args) {
		
		ArrayList<SungJuk2VO> mdb = new ArrayList<>();										// 메모리에 저장 되기 때문에 프로그램 종료되면 데이터 사라짐
		String dfmt1 = "0.00";
		String dfmt2 = "#.##";
		String hr = "------------------------------------------";
		String newMsg1 = "새로운 성적 데이터를 입력합니다.";
		String newMsg2 = "이름, 국어, 영어, 수학순으로 입력하세요.";
		String newMsg3 = "성적 등록 완료!";
		String newMsg4 = "계속 입력하시겠습니까? (y : 예, n : 아니오)";
		String newMsg5 = "성적 등록 실패! - 숫자만 입력하세요.";
		String newMsg6 = "성적 등록 실패! - 알 수 없는 오류 발생";
		
		String readMsg1 = "전체 성적 데이터 출력";
		String readMsg2 = "검색 할 성적 데이터의 이름을 입력하세요.";
		String readMsg3 = "데이터를 찾았습니다.";
		String readMsg4 = "데이터가 없습니다.";
		
		String modifyMsg1 = "기존 성적 데이터를 수정합니다.";
		String modifyMsg2 = "수정할 데이터의 이름을 입력하세요.";
		String modifyMsg3 = "이름, 국어, 영어, 수학순으로 입력하세요";
		String modifyMsg4 = "수정 결과는 다음과 같습니다.";
		String modifyMsg5 = "데이터가 없습니다.";
		
		String removeMsg1 = "특정 성적 데이터를 삭제합니다.";
		String removeMsg2 = "삭제할 데이터의 이름을 입력하세요.";
		String removeMsg3 = "성공적으로 삭제되었습니다.";
		String removeMsg4 = "삭제할 데이터가 없습니다.";
		
		// 성적 데이터 입력 Create
		Scanner sc = new Scanner(System.in);
		SungJuk2VO sj = null;
		
		System.out.println(newMsg1);
				
		while(true) {
		System.out.println(newMsg2);
			try {
				String name = sc.next();
				int kor = sc.nextInt();
				int eng = sc.nextInt();
				int mat = sc.nextInt();
				
				sj = new SungJuk2VO(name, kor, eng, mat);
				sj.setTot(sj.getKor() + sj.getEng() + sj.getMat());
				
				DecimalFormat df = new DecimalFormat(dfmt2);									// sj.setAvg = (double)sj.getTot / 3 을 할 경우 소숫점이 많이 나오는데
				String avg = df.format((double)sj.getTot() / 3);											// DecimalFormat()을 사용해서 문자형 "000.00", "###.##" 을 이용해 출력 하면
				sj.setAvg(Double.parseDouble(avg));														// 내가 지정한 형식의 문자형으로 저장된다. 형변환을 통해 sj.setAvg에 저장을 하면 된다.
																																	// double 형으로 저장 해야 하기 때문에 double.parseDouble(avg)를 한다
				switch ((int)sj.getAvg() / 10 ) {
					case 10 : case 9 : sj.setGrd('수'); break;
					case 8 : sj.setGrd('우'); break;
					case 7 : sj.setGrd('미'); break;
					case 6 : sj.setGrd('양'); break;
					default : sj.setGrd('가');
				}
				mdb.add(sj);																								// ArrayList에 데이터 추가
				System.out.println(newMsg3);																	// sj 객체의 생성자를 통해 입력 받은 데이터를 추가하기 위해 add(sj)를 함
				
				// 입력 여부 확인
				System.out.println(newMsg4);
				if (sc.next().equals("n"))  break;
				
				} catch(InputMismatchException ime) {
					sj = null;																										// 객체 제거
					sc = new Scanner(System.in);																	// 오류 발생 시 입력 초기화
					System.out.println(newMsg5);																	// 초기화 하지 않으면 버퍼에 남아 있는 값때문에 다음 실행에 영향을 미침
				} catch (Exception ex) {
					sj = null;																										// 객체 제거
					sc = new Scanner(System.in);																	// 오류 발생 시 입력 초기화
					ex.printStackTrace();																					// 자세한 오류 내용 출력
					System.out.println(newMsg6);
				}
		}
		System.out.println(hr);
		
		// 성적 데이터 조회 Retrieve
		System.out.println(readMsg1);
		StringBuilder sb = new StringBuilder();
		for (SungJuk2VO s : mdb) {
			sb.append(s.toString()).append("\n");
		}
		System.out.println(sb);
		System.out.println(hr);
		
		// 검색
		System.out.println(readMsg2);
		String key = sc.next();																						// 이름 입력 받음
		SungJuk2VO findOne = null;																			// 아직 데이터 없음.
		
		for (SungJuk2VO s : mdb) {
			if (s.getName().contains(key)) {
				findOne = s;																								// 검색된 데이터를 findOne에 저장
				break;																											// 찾기만 하기 위해. 출력까지 하면 나중에 힘듬. 각 기능을 따로 구현
			}
		}
		if (findOne != null) {
			System.out.println(readMsg3);
			System.out.println(findOne);
		} else {
			System.out.println(readMsg4);
		}
		System.out.println(hr);
		
		// 성적 데이터 수정 Update
		System.out.println(modifyMsg1);
		System.out.println(modifyMsg2);
		
		key = sc.next();
		findOne = null;
		int position = 0;																									// 검색한 데이터의 위치
		
		for (SungJuk2VO s : mdb) {
			if (s.getName().equals(key)) {
				findOne = s;
				break;
			}
			++position;
		}
		
		if (findOne != null) {
			System.out.println(findOne);
			System.out.println(modifyMsg3);
			findOne = new SungJuk2VO(sc.next(),sc.nextInt(), sc.nextInt(), sc.nextInt());

			findOne.setTot(findOne.getKor() + findOne.getEng() + findOne.getMat());
			
			DecimalFormat df = new DecimalFormat(dfmt2);
			String avg = df.format((double)findOne.getTot() / 3);
			findOne.setAvg(Double.parseDouble(avg));

			switch ((int)findOne.getAvg() / 10 ) {
				case 10 : case 9 : findOne.setGrd('수'); break;
				case 8 : findOne.setGrd('우'); break;
				case 7 : findOne.setGrd('미'); break;
				case 6 : findOne.setGrd('양'); break;
				default : findOne.setGrd('가');
			}
			// 수정된 입력값들을 ArrayList mdb에 반영
			mdb.set(position, findOne);
			
			System.out.println(modifyMsg4);
			System.out.println(mdb.get(position));
		} else {
			System.out.println(modifyMsg5);
		}
		System.out.println(hr);
		
		// 성적 데이터 삭제 Delete
		System.out.println(removeMsg1);
		System.out.println(removeMsg2);
		
		key = sc.next();
		boolean findOk = false;
		position = 0;
		
		for (int i = 0; i < mdb.size(); ++i) {																	// for-each 와 비교해보기 위해 for문을 사용함
			SungJuk2VO s = mdb.get(i);																		// 첫번째 데이터를 s에 넣음
			if (s.getName().equals(key)) {																	// s의 name과 key를 비교
				findOk = true;
				position = i;
				break;
			}
		}
		if (findOk) {
			mdb.remove(position);																				// 삭제
			System.out.println(removeMsg3);
			
			sb = new StringBuilder();
			for (SungJuk2VO s : mdb) {
				sb.append(s.toString()).append("\n");
			}
			System.out.println(sb);
		} else {
			System.out.println(removeMsg4);
		}
	}

}
